<!DOCTYPE html>
<html lang="en-US">
<head>
    <meta charset="UTF-8"/>
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <meta name="language" content="en" />
        <link href="./assets/ffd55088/css/bootstrap.css" rel="stylesheet">
<link href="./assets/5cf9384a/solarized_light.css" rel="stylesheet">
<link href="./assets/6c54116e/style.css" rel="stylesheet">
<script src="./assets/a44cef0f/jquery.js"></script>
<script src="./assets/ffd55088/js/bootstrap.js"></script>
<script src="./assets/8ac4e28a/jssearch.js"></script>    <title>Response Formatting - RESTful Web Services - The Definitive Guide to Yii 2.0</title>
</head>
<body>

<div class="wrap">
    <nav id="w225" class="navbar-inverse navbar-fixed-top navbar" role="navigation"><div class="navbar-header"><button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#w225-collapse"><span class="sr-only">Toggle navigation</span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
<span class="icon-bar"></span></button><a class="navbar-brand" href="./index.html">The Definitive Guide to Yii 2.0</a></div><div id="w225-collapse" class="collapse navbar-collapse"><ul id="w226" class="navbar-nav nav"><li><a href="./index.html">Class reference</a></li>
<li class="dropdown"><a class="dropdown-toggle" href="#" data-toggle="dropdown">Extensions <b class="caret"></b></a><ul id="w227" class="dropdown-menu"><li><a href="./ext-apidoc-index.html" tabindex="-1">apidoc</a></li>
<li><a href="./ext-authclient-index.html" tabindex="-1">authclient</a></li>
<li><a href="./ext-bootstrap-index.html" tabindex="-1">bootstrap</a></li>
<li><a href="./ext-codeception-index.html" tabindex="-1">codeception</a></li>
<li><a href="./ext-debug-index.html" tabindex="-1">debug</a></li>
<li><a href="./ext-elasticsearch-index.html" tabindex="-1">elasticsearch</a></li>
<li><a href="./ext-faker-index.html" tabindex="-1">faker</a></li>
<li><a href="./ext-gii-index.html" tabindex="-1">gii</a></li>
<li><a href="./ext-imagine-index.html" tabindex="-1">imagine</a></li>
<li><a href="./ext-jui-index.html" tabindex="-1">jui</a></li>
<li><a href="./ext-mongodb-index.html" tabindex="-1">mongodb</a></li>
<li><a href="./ext-redis-index.html" tabindex="-1">redis</a></li>
<li><a href="./ext-smarty-index.html" tabindex="-1">smarty</a></li>
<li><a href="./ext-sphinx-index.html" tabindex="-1">sphinx</a></li>
<li><a href="./ext-swiftmailer-index.html" tabindex="-1">swiftmailer</a></li>
<li><a href="./ext-twig-index.html" tabindex="-1">twig</a></li></ul></li>
<li><a href="./guide-README.html">Guide</a></li></ul><div class="navbar-form navbar-left" role="search">
  <div class="form-group">
    <input id="searchbox" type="text" class="form-control" placeholder="Search">
  </div>
</div>
</div></nav>
    <div id="search-resultbox" style="display: none;" class="modal-content">
        <ul id="search-results">
        </ul>
    </div>

    
<div class="row">
    <div class="col-md-2">
                <div id="navigation" class="list-group"><a class="list-group-item" href="#navigation-209" data-toggle="collapse" data-parent="#navigation">Introduction <b class="caret"></b></a><div id="navigation-209" class="submenu panel-collapse collapse"><a class="list-group-item" href="./guide-intro-yii.html">About Yii</a>
<a class="list-group-item" href="./guide-intro-upgrade-from-v1.html">Upgrading from Version 1.1</a></div>
<a class="list-group-item" href="#navigation-210" data-toggle="collapse" data-parent="#navigation">Getting Started <b class="caret"></b></a><div id="navigation-210" class="submenu panel-collapse collapse"><a class="list-group-item" href="./guide-start-installation.html">Installing Yii</a>
<a class="list-group-item" href="./guide-start-workflow.html">Running Applications</a>
<a class="list-group-item" href="./guide-start-hello.html">Saying Hello</a>
<a class="list-group-item" href="./guide-start-forms.html">Working with Forms</a>
<a class="list-group-item" href="./guide-start-databases.html">Working with Databases</a>
<a class="list-group-item" href="./guide-start-gii.html">Generating Code with Gii</a>
<a class="list-group-item" href="./guide-start-looking-ahead.html">Looking Ahead</a></div>
<a class="list-group-item" href="#navigation-211" data-toggle="collapse" data-parent="#navigation">Application Structure <b class="caret"></b></a><div id="navigation-211" class="submenu panel-collapse collapse"><a class="list-group-item" href="./guide-structure-overview.html">Overview</a>
<a class="list-group-item" href="./guide-structure-entry-scripts.html">Entry Scripts</a>
<a class="list-group-item" href="./guide-structure-applications.html">Applications</a>
<a class="list-group-item" href="./guide-structure-application-components.html">Application Components</a>
<a class="list-group-item" href="./guide-structure-controllers.html">Controllers</a>
<a class="list-group-item" href="./guide-structure-models.html">Models</a>
<a class="list-group-item" href="./guide-structure-views.html">Views</a>
<a class="list-group-item" href="./guide-structure-modules.html">Modules</a>
<a class="list-group-item" href="./guide-structure-filters.html">Filters</a>
<a class="list-group-item" href="./guide-structure-widgets.html">Widgets</a>
<a class="list-group-item" href="./guide-structure-assets.html">Assets</a>
<a class="list-group-item" href="./guide-structure-extensions.html">Extensions</a></div>
<a class="list-group-item" href="#navigation-212" data-toggle="collapse" data-parent="#navigation">Handling Requests <b class="caret"></b></a><div id="navigation-212" class="submenu panel-collapse collapse"><a class="list-group-item" href="./guide-runtime-overview.html">Overview</a>
<a class="list-group-item" href="./guide-runtime-bootstrapping.html">Bootstrapping</a>
<a class="list-group-item" href="./guide-runtime-routing.html">Routing and URL Creation</a>
<a class="list-group-item" href="./guide-runtime-requests.html">Requests</a>
<a class="list-group-item" href="./guide-runtime-responses.html">Responses</a>
<a class="list-group-item" href="./guide-runtime-sessions-cookies.html">Sessions and Cookies</a>
<a class="list-group-item" href="./guide-runtime-handling-errors.html">Handling Errors</a>
<a class="list-group-item" href="./guide-runtime-logging.html">Logging</a></div>
<a class="list-group-item" href="#navigation-213" data-toggle="collapse" data-parent="#navigation">Key Concepts <b class="caret"></b></a><div id="navigation-213" class="submenu panel-collapse collapse"><a class="list-group-item" href="./guide-concept-components.html">Components</a>
<a class="list-group-item" href="./guide-concept-properties.html">Properties</a>
<a class="list-group-item" href="./guide-concept-events.html">Events</a>
<a class="list-group-item" href="./guide-concept-behaviors.html">Behaviors</a>
<a class="list-group-item" href="./guide-concept-configurations.html">Configurations</a>
<a class="list-group-item" href="./guide-concept-aliases.html">Aliases</a>
<a class="list-group-item" href="./guide-concept-autoloading.html">Class Autoloading</a>
<a class="list-group-item" href="./guide-concept-service-locator.html">Service Locator</a>
<a class="list-group-item" href="./guide-concept-di-container.html">Dependency Injection Container</a></div>
<a class="list-group-item" href="#navigation-214" data-toggle="collapse" data-parent="#navigation">Working with Databases <b class="caret"></b></a><div id="navigation-214" class="submenu panel-collapse collapse"><a class="list-group-item" href="./guide-db-dao.html">Data Access Objects</a>
<a class="list-group-item" href="./guide-db-query-builder.html">Query Builder</a>
<a class="list-group-item" href="./guide-db-active-record.html">Active Record</a>
<a class="list-group-item" href="./guide-db-migrations.html">Migrations</a>
<a class="list-group-item" href="https://github.com/yiisoft/yii2-sphinx/blob/master/docs/guide/README.md">Sphinx</a>
<a class="list-group-item" href="https://github.com/yiisoft/yii2-redis/blob/master/docs/guide/README.md">Redis</a>
<a class="list-group-item" href="https://github.com/yiisoft/yii2-mongodb/blob/master/docs/guide/README.md">MongoDB</a>
<a class="list-group-item" href="https://github.com/yiisoft/yii2-elasticsearch/blob/master/docs/guide/README.md">ElasticSearch</a></div>
<a class="list-group-item" href="#navigation-215" data-toggle="collapse" data-parent="#navigation">Getting Data from Users <b class="caret"></b></a><div id="navigation-215" class="submenu panel-collapse collapse"><a class="list-group-item" href="./guide-input-forms.html">Creating Forms</a>
<a class="list-group-item" href="./guide-input-validation.html">Validating Input</a>
<a class="list-group-item" href="./guide-input-file-upload.html">Uploading Files</a>
<a class="list-group-item" href="./guide-input-tabular-input.html">Collecting Tabular Input</a>
<a class="list-group-item" href="./guide-input-multiple-models.html">Getting Data for Multiple Models</a></div>
<a class="list-group-item" href="#navigation-216" data-toggle="collapse" data-parent="#navigation">Displaying Data <b class="caret"></b></a><div id="navigation-216" class="submenu panel-collapse collapse"><a class="list-group-item" href="./guide-output-formatting.html">Data Formatting</a>
<a class="list-group-item" href="./guide-output-pagination.html">Pagination</a>
<a class="list-group-item" href="./guide-output-sorting.html">Sorting</a>
<a class="list-group-item" href="./guide-output-data-providers.html">Data Providers</a>
<a class="list-group-item" href="./guide-output-data-widgets.html">Data Widgets</a>
<a class="list-group-item" href="./guide-output-client-scripts.html">Working with Client Scripts</a>
<a class="list-group-item" href="./guide-output-theming.html">Theming</a></div>
<a class="list-group-item" href="#navigation-217" data-toggle="collapse" data-parent="#navigation">Security <b class="caret"></b></a><div id="navigation-217" class="submenu panel-collapse collapse"><a class="list-group-item" href="./guide-security-overview.html">Overview</a>
<a class="list-group-item" href="./guide-security-authentication.html">Authentication</a>
<a class="list-group-item" href="./guide-security-authorization.html">Authorization</a>
<a class="list-group-item" href="./guide-security-passwords.html">Working with Passwords</a>
<a class="list-group-item" href="./guide-security-cryptography.html">Cryptography</a>
<a class="list-group-item" href="./guide-structure-views.html#security">Views security</a>
<a class="list-group-item" href="https://github.com/yiisoft/yii2-authclient/blob/master/docs/guide/README.md">Auth Clients</a>
<a class="list-group-item" href="./guide-security-best-practices.html">Best Practices</a></div>
<a class="list-group-item" href="#navigation-218" data-toggle="collapse" data-parent="#navigation">Caching <b class="caret"></b></a><div id="navigation-218" class="submenu panel-collapse collapse"><a class="list-group-item" href="./guide-caching-overview.html">Overview</a>
<a class="list-group-item" href="./guide-caching-data.html">Data Caching</a>
<a class="list-group-item" href="./guide-caching-fragment.html">Fragment Caching</a>
<a class="list-group-item" href="./guide-caching-page.html">Page Caching</a>
<a class="list-group-item" href="./guide-caching-http.html">HTTP Caching</a></div>
<a class="list-group-item active" href="#navigation-219" data-toggle="collapse" data-parent="#navigation">RESTful Web Services <b class="caret"></b></a><div id="navigation-219" class="submenu panel-collapse collapse in"><a class="list-group-item" href="./guide-rest-quick-start.html">Quick Start</a>
<a class="list-group-item" href="./guide-rest-resources.html">Resources</a>
<a class="list-group-item" href="./guide-rest-controllers.html">Controllers</a>
<a class="list-group-item" href="./guide-rest-routing.html">Routing</a>
<a class="list-group-item active" href="./guide-rest-response-formatting.html">Response Formatting</a>
<a class="list-group-item" href="./guide-rest-authentication.html">Authentication</a>
<a class="list-group-item" href="./guide-rest-rate-limiting.html">Rate Limiting</a>
<a class="list-group-item" href="./guide-rest-versioning.html">Versioning</a>
<a class="list-group-item" href="./guide-rest-error-handling.html">Error Handling</a></div>
<a class="list-group-item" href="#navigation-220" data-toggle="collapse" data-parent="#navigation">Development Tools <b class="caret"></b></a><div id="navigation-220" class="submenu panel-collapse collapse"><a class="list-group-item" href="https://github.com/yiisoft/yii2-debug/blob/master/docs/guide/README.md">Debug Toolbar and Debugger</a>
<a class="list-group-item" href="https://github.com/yiisoft/yii2-gii/blob/master/docs/guide/README.md">Generating Code using Gii</a>
<a class="list-group-item" href="https://github.com/yiisoft/yii2-apidoc">Generating API Documentation</a></div>
<a class="list-group-item" href="#navigation-221" data-toggle="collapse" data-parent="#navigation">Testing <b class="caret"></b></a><div id="navigation-221" class="submenu panel-collapse collapse"><a class="list-group-item" href="./guide-test-overview.html">Overview</a>
<a class="list-group-item" href="./guide-test-environment-setup.html">Testing environment setup</a>
<a class="list-group-item" href="./guide-test-unit.html">Unit Tests</a>
<a class="list-group-item" href="./guide-test-functional.html">Functional Tests</a>
<a class="list-group-item" href="./guide-test-acceptance.html">Acceptance Tests</a>
<a class="list-group-item" href="./guide-test-fixtures.html">Fixtures</a></div>
<a class="list-group-item" href="#navigation-222" data-toggle="collapse" data-parent="#navigation">Special Topics <b class="caret"></b></a><div id="navigation-222" class="submenu panel-collapse collapse"><a class="list-group-item" href="https://github.com/yiisoft/yii2-app-advanced/blob/master/docs/guide/README.md">Advanced Project Template</a>
<a class="list-group-item" href="./guide-tutorial-start-from-scratch.html">Building Application from Scratch</a>
<a class="list-group-item" href="./guide-tutorial-console.html">Console Commands</a>
<a class="list-group-item" href="./guide-tutorial-core-validators.html">Core Validators</a>
<a class="list-group-item" href="./guide-tutorial-i18n.html">Internationalization</a>
<a class="list-group-item" href="./guide-tutorial-mailing.html">Mailing</a>
<a class="list-group-item" href="./guide-tutorial-performance-tuning.html">Performance Tuning</a>
<a class="list-group-item" href="./guide-tutorial-shared-hosting.html">Shared Hosting Environment</a>
<a class="list-group-item" href="./guide-tutorial-template-engines.html">Template Engines</a>
<a class="list-group-item" href="./guide-tutorial-yii-integration.html">Working with Third-Party Code</a></div>
<a class="list-group-item" href="#navigation-223" data-toggle="collapse" data-parent="#navigation">Widgets <b class="caret"></b></a><div id="navigation-223" class="submenu panel-collapse collapse"><a class="list-group-item" href="https://github.com/yiisoft/yii2-bootstrap/blob/master/docs/guide/README.md">Bootstrap Widgets</a>
<a class="list-group-item" href="https://github.com/yiisoft/yii2-jui/blob/master/docs/guide/README.md">jQuery UI Widgets</a></div>
<a class="list-group-item" href="#navigation-224" data-toggle="collapse" data-parent="#navigation">Helpers <b class="caret"></b></a><div id="navigation-224" class="submenu panel-collapse collapse"><a class="list-group-item" href="./guide-helper-overview.html">Overview</a>
<a class="list-group-item" href="./guide-helper-array.html">ArrayHelper</a>
<a class="list-group-item" href="./guide-helper-html.html">Html</a>
<a class="list-group-item" href="./guide-helper-url.html">Url</a></div></div>    </div>
    <div class="col-md-9 guide-content" role="main">
        <h1>Response Formatting <span id="response-formatting"></span><a href="#response-formatting" class="hashlink">&para;</a></h1>
<div class="toc"><ol><li><a href="#content-negotiation">Content Negotiation</a></li>
<li><a href="#data-serializing">Data Serializing</a></li></ol></div>
<p>When handling a RESTful API request, an application usually takes the following steps that are related
with response formatting:</p>
<ol>
<li>Determine various factors that may affect the response format, such as media type, language, version, etc.
This process is also known as <a href="http://en.wikipedia.org/wiki/Content_negotiation">content negotiation</a>.</li>
<li>Convert resource objects into arrays, as described in the <a href="guide-rest-resources.html">Resources</a> section.
This is done by <a href="./yii-rest-serializer.html">yii\rest\Serializer</a>.</li>
<li>Convert arrays into a string in the format as determined by the content negotiation step. This is
done by <a href="./yii-web-responseformatterinterface.html">response formatters</a> registered with
the <a href="./yii-web-response.html#$formatters-detail">formatters</a> property of the
<code>response</code> <a href="guide-structure-application-components.html">application component</a>.</li>
</ol>
<h2>Content Negotiation  <span id="content-negotiation"></span><a href="#content-negotiation" class="hashlink">&para;</a></h2><p>Yii supports content negotiation via the <a href="./yii-filters-contentnegotiator.html">yii\filters\ContentNegotiator</a> filter. The RESTful API base
controller class <a href="./yii-rest-controller.html">yii\rest\Controller</a> is equipped with this filter under the name of <code>contentNegotiator</code>.
The filter provides response format negotiation as well as language negotiation. For example, if a RESTful
API request contains the following header,</p>
<pre><code class="hljs http"><span class="hljs-attribute">Accept</span>: <span class="hljs-string">application/json; q=1.0, */*; q=0.1</span>
</code></pre>
<p>it will get a response in JSON format, like the following:</p>
<pre><code class="hljs php">$ curl -i -H <span class="hljs-string">"Accept: application/json; q=1.0, */*; q=0.1"</span> <span class="hljs-string">"http://localhost/users"</span>

HTTP/<span class="hljs-number">1.1</span> <span class="hljs-number">200</span> OK
Date: Sun, <span class="hljs-number">02</span> Mar <span class="hljs-number">2014</span> <span class="hljs-number">05</span>:<span class="hljs-number">31</span>:<span class="hljs-number">43</span> GMT
Server: Apache/<span class="hljs-number">2.2</span><span class="hljs-number">.26</span> (Unix) DAV/<span class="hljs-number">2</span> PHP/<span class="hljs-number">5.4</span><span class="hljs-number">.20</span> mod_ssl/<span class="hljs-number">2.2</span><span class="hljs-number">.26</span> OpenSSL/<span class="hljs-number">0.9</span><span class="hljs-number">.8</span>y
X-Powered-By: PHP/<span class="hljs-number">5.4</span><span class="hljs-number">.20</span>
X-Pagination-Total-Count: <span class="hljs-number">1000</span>
X-Pagination-Page-Count: <span class="hljs-number">50</span>
X-Pagination-Current-Page: <span class="hljs-number">1</span>
X-Pagination-Per-Page: <span class="hljs-number">20</span>
Link: &lt;http:<span class="hljs-comment">//localhost/users?page=1&gt;; rel=self,</span>
      &lt;http:<span class="hljs-comment">//localhost/users?page=2&gt;; rel=next,</span>
      &lt;http:<span class="hljs-comment">//localhost/users?page=50&gt;; rel=last</span>
Transfer-Encoding: chunked
Content-Type: application/json; charset=UTF-<span class="hljs-number">8</span>

[
    {
        <span class="hljs-string">"id"</span>: <span class="hljs-number">1</span>,
        ...
    },
    {
        <span class="hljs-string">"id"</span>: <span class="hljs-number">2</span>,
        ...
    },
    ...
]
</code></pre>
<p>Behind the scene, before a RESTful API controller action is executed, the <a href="./yii-filters-contentnegotiator.html">yii\filters\ContentNegotiator</a>
filter will check the <code>Accept</code> HTTP header in the request and set the <a href="./yii-web-response.html#$format-detail">response format</a>
to be <code>'json'</code>. After the action is executed and returns the resulting resource object or collection,
<a href="./yii-rest-serializer.html">yii\rest\Serializer</a> will convert the result into an array. And finally, <a href="./yii-web-jsonresponseformatter.html">yii\web\JsonResponseFormatter</a>
will serialize the array into a JSON string and include it in the response body.</p>
<p>By default, RESTful APIs support both JSON and XML formats. To support a new format, you should configure
the <a href="./yii-filters-contentnegotiator.html#$formats-detail">formats</a> property of the <code>contentNegotiator</code> filter like
the following in your API controller classes:</p>
<pre><code class="hljs php language-php"><span class="hljs-keyword">use</span> <span class="hljs-title">yii</span>\<span class="hljs-title">web</span>\<span class="hljs-title">Response</span>;

<span class="hljs-keyword">public</span> <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">behaviors</span><span class="hljs-params">()</span>
</span>{
    <span class="hljs-variable">$behaviors</span> = <span class="hljs-keyword">parent</span>::behaviors();
    <span class="hljs-variable">$behaviors</span>[<span class="hljs-string">'contentNegotiator'</span>][<span class="hljs-string">'formats'</span>][<span class="hljs-string">'text/html'</span>] = Response::FORMAT_HTML;
    <span class="hljs-keyword">return</span> <span class="hljs-variable">$behaviors</span>;
}
</code></pre>
<p>The keys of the <code>formats</code> property are the supported MIME types, while the values are the corresponding
response format names which must be supported in <a href="./yii-web-response.html#$formatters-detail">yii\web\Response::$formatters</a>.</p>
<h2>Data Serializing  <span id="data-serializing"></span><a href="#data-serializing" class="hashlink">&para;</a></h2><p>As we have described above, <a href="./yii-rest-serializer.html">yii\rest\Serializer</a> is the central piece responsible for converting resource
objects or collections into arrays. It recognizes objects implementing <span class="broken-link">yii\base\ArrayableInterface</span> as
well as <a href="./yii-data-dataproviderinterface.html">yii\data\DataProviderInterface</a>. The former is mainly implemented by resource objects, while
the latter resource collections.</p>
<p>You may configure the serializer by setting the <a href="./yii-rest-controller.html#$serializer-detail">yii\rest\Controller::$serializer</a> property with a configuration array.
For example, sometimes you may want to help simplify the client development work by including pagination information
directly in the response body. To do so, configure the <a href="./yii-rest-serializer.html#$collectionEnvelope-detail">yii\rest\Serializer::$collectionEnvelope</a> property
as follows:</p>
<pre><code class="hljs php language-php"><span class="hljs-keyword">use</span> <span class="hljs-title">yii</span>\<span class="hljs-title">rest</span>\<span class="hljs-title">ActiveController</span>;

<span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">UserController</span> <span class="hljs-keyword">extends</span> <span class="hljs-title">ActiveController</span>
</span>{
    <span class="hljs-keyword">public</span> <span class="hljs-variable">$modelClass</span> = <span class="hljs-string">'app\models\User'</span>;
    <span class="hljs-keyword">public</span> <span class="hljs-variable">$serializer</span> = [
        <span class="hljs-string">'class'</span> =&gt; <span class="hljs-string">'yii\rest\Serializer'</span>,
        <span class="hljs-string">'collectionEnvelope'</span> =&gt; <span class="hljs-string">'items'</span>,
    ];
}
</code></pre>
<p>You may then get the following response for request <code>http://localhost/users</code>:</p>
<pre><code class="hljs php">HTTP/<span class="hljs-number">1.1</span> <span class="hljs-number">200</span> OK
Date: Sun, <span class="hljs-number">02</span> Mar <span class="hljs-number">2014</span> <span class="hljs-number">05</span>:<span class="hljs-number">31</span>:<span class="hljs-number">43</span> GMT
Server: Apache/<span class="hljs-number">2.2</span><span class="hljs-number">.26</span> (Unix) DAV/<span class="hljs-number">2</span> PHP/<span class="hljs-number">5.4</span><span class="hljs-number">.20</span> mod_ssl/<span class="hljs-number">2.2</span><span class="hljs-number">.26</span> OpenSSL/<span class="hljs-number">0.9</span><span class="hljs-number">.8</span>y
X-Powered-By: PHP/<span class="hljs-number">5.4</span><span class="hljs-number">.20</span>
X-Pagination-Total-Count: <span class="hljs-number">1000</span>
X-Pagination-Page-Count: <span class="hljs-number">50</span>
X-Pagination-Current-Page: <span class="hljs-number">1</span>
X-Pagination-Per-Page: <span class="hljs-number">20</span>
Link: &lt;http:<span class="hljs-comment">//localhost/users?page=1&gt;; rel=self,</span>
      &lt;http:<span class="hljs-comment">//localhost/users?page=2&gt;; rel=next,</span>
      &lt;http:<span class="hljs-comment">//localhost/users?page=50&gt;; rel=last</span>
Transfer-Encoding: chunked
Content-Type: application/json; charset=UTF-<span class="hljs-number">8</span>

{
    <span class="hljs-string">"items"</span>: [
        {
            <span class="hljs-string">"id"</span>: <span class="hljs-number">1</span>,
            ...
        },
        {
            <span class="hljs-string">"id"</span>: <span class="hljs-number">2</span>,
            ...
        },
        ...
    ],
    <span class="hljs-string">"_links"</span>: {
        <span class="hljs-string">"self"</span>: {
            <span class="hljs-string">"href"</span>: <span class="hljs-string">"http://localhost/users?page=1"</span>
        },
        <span class="hljs-string">"next"</span>: {
            <span class="hljs-string">"href"</span>: <span class="hljs-string">"http://localhost/users?page=2"</span>
        },
        <span class="hljs-string">"last"</span>: {
            <span class="hljs-string">"href"</span>: <span class="hljs-string">"http://localhost/users?page=50"</span>
        }
    },
    <span class="hljs-string">"_meta"</span>: {
        <span class="hljs-string">"totalCount"</span>: <span class="hljs-number">1000</span>,
        <span class="hljs-string">"pageCount"</span>: <span class="hljs-number">50</span>,
        <span class="hljs-string">"currentPage"</span>: <span class="hljs-number">1</span>,
        <span class="hljs-string">"perPage"</span>: <span class="hljs-number">20</span>
    }
}
</code></pre>
<h3>Controlling JSON output <span id="controlling-json-output"></span><a href="#controlling-json-output" class="hashlink">&para;</a></h3><p>The JSON response is generated by the <a href="./yii-web-jsonresponseformatter.html">JsonResponseFormatter</a> class which will
use the <a href="./yii-helpers-json.html">JSON helper</a> internally. This formatter can be configured with different options like
for example the <a href="./yii-web-jsonresponseformatter.html#$prettyPrint-detail">$prettyPrint</a> option, which is useful on development for
better readable responses, or <a href="./yii-web-jsonresponseformatter.html#$encodeOptions-detail">$encodeOptions</a> to control the output
of the JSON encoding.</p>
<p>The formatter can be configured in the <a href="./yii-web-response.html#$formatters-detail">formatters</a> property of the <code>response</code> application
component in the application <a href="guide-concept-configuration.html">configuration</a> like the following:</p>
<pre><code class="hljs php language-php"><span class="hljs-string">'response'</span> =&gt; [
    <span class="hljs-comment">// ...</span>
    <span class="hljs-string">'formatters'</span> =&gt; [
        \yii\web\Response::FORMAT_JSON =&gt; [
            <span class="hljs-string">'class'</span> =&gt; <span class="hljs-string">'yii\web\JsonResponseFormatter'</span>,
            <span class="hljs-string">'prettyPrint'</span> =&gt; YII_DEBUG, <span class="hljs-comment">// use "pretty" output in debug mode</span>
            <span class="hljs-string">'encodeOptions'</span> =&gt; JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE,
            <span class="hljs-comment">// ...</span>
        ],
    ],
],
</code></pre>
<p>When returning data from a database using the <a href="guide-db-dao.html">DAO</a> database layer all data will be represented
as strings, which is not always the expected result especially numeric values should be represented as
numbers in JSON. When using the ActiveRecord layer for retrieving data from the database, the values for numeric
columns will be converted to integers when data is fetched from the database in <a href="./yii-db-activerecord.html#populateRecord()-detail">yii\db\ActiveRecord::populateRecord()</a>.</p>
        <div class="toplink"><a href="#" class="h1" title="go to top"><span class="glyphicon glyphicon-arrow-up"></a></div>
    </div>
</div>


</div>

<footer class="footer">
        <p class="pull-right"><small>Page generated on Sat, 09 Jul 2016 12:16:28 +0000</small></p>
    Powered by <a href="http://www.yiiframework.com/" rel="external">Yii Framework</a></footer>

<script type="text/javascript">jQuery(document).ready(function () {
    var shiftWindow = function () { scrollBy(0, -50) };
    if (location.hash) setTimeout(shiftWindow, 1);
    window.addEventListener("hashchange", shiftWindow);
var element = document.createElement("script");
element.src = "./jssearch.index.js";
document.body.appendChild(element);

var searchBox = $('#searchbox');

// search when typing in search field
searchBox.on("keyup", function(event) {
    var query = $(this).val();

    if (query == '' || event.which == 27) {
        $('#search-resultbox').hide();
        return;
    } else if (event.which == 13) {
        var selectedLink = $('#search-resultbox a.selected');
        if (selectedLink.length != 0) {
            document.location = selectedLink.attr('href');
            return;
        }
    } else if (event.which == 38 || event.which == 40) {
        $('#search-resultbox').show();

        var selected = $('#search-resultbox a.selected');
        if (selected.length == 0) {
            $('#search-results').find('a').first().addClass('selected');
        } else {
            var next;
            if (event.which == 40) {
                next = selected.parent().next().find('a').first();
            } else {
                next = selected.parent().prev().find('a').first();
            }
            if (next.length != 0) {
                var resultbox = $('#search-results');
                var position = next.position();

//              TODO scrolling is buggy and jumps around
//                resultbox.scrollTop(Math.floor(position.top));
//                console.log(position.top);

                selected.removeClass('selected');
                next.addClass('selected');
            }
        }

        return;
    }
    $('#search-resultbox').show();
    $('#search-results').html('<li><span class="no-results">No results</span></li>');

    var result = jssearch.search(query);

    if (result.length > 0) {
        var i = 0;
        var resHtml = '';

        for (var key in result) {
            if (i++ > 20) {
                break;
            }
            resHtml = resHtml +
            '<li><a href="' + result[key].file.u.substr(3) +'"><span class="title">' + result[key].file.t + '</span>' +
            '<span class="description">' + result[key].file.d + '</span></a></li>';
        }
        $('#search-results').html(resHtml);
    }
});

// hide the search results on ESC
$(document).on("keyup", function(event) { if (event.which == 27) { $('#search-resultbox').hide(); } });
// hide search results on click to document
$(document).bind('click', function (e) { $('#search-resultbox').hide(); });
// except the following:
searchBox.bind('click', function(e) { e.stopPropagation(); });
$('#search-resultbox').bind('click', function(e) { e.stopPropagation(); });

});</script></body>
</html>
